//
// Created by ASUS on 2024/5/31/星期五.
//

#include <bits/stdc++.h>
using namespace std;

const int mod = 1e9 + 7;

struct Node {
	int l, r;
	int f00, f01, f10, f11;
};

class SegmentTree {
public:
	vector<Node> t;
	SegmentTree(int n) { t.resize(4 * n); }
	~SegmentTree() = default;

	void pushup(int i) {
		t[i].f00 = max(t[2 * i].f00 + t[2 * i + 1].f10,t[2 * i].f01 + t[2 * i + 1].f00);
		t[i].f01 = max(t[2 * i].f01 + t[2 * i + 1].f01,t[2 * i].f00 + t[2 * i + 1].f11);
		t[i].f10 = max(t[2 * i].f10 + t[2 * i + 1].f10,t[2 * i].f11 + t[2 * i + 1].f00);
		t[i].f11 = max(t[2 * i].f10 + t[2 * i + 1].f11,t[2 * i].f11 + t[2 * i + 1].f01);
	}

	void build(int i, int l, int r, vector<int>& a) {
		t[i].l = l;
		t[i].r = r;
		if (l == r) {
			t[i].f11 = max(a[l - 1], 0);
			return;
		}
		int mid = l + (r - l) / 2;
		build(2 * i, l, mid, a);
		build(2 * i + 1, mid + 1, r, a);
		pushup(i);
	}
	//通过传入区间的收敛找到更改点，所以要更改l,r
	void update(int i, int l, int r, int j, int x) {
		if (l == r) {
			t[i].f11 = max<int>(x, 0);
			return;
		}
		int mid = l + (r - l) / 2;
		if (j <= mid)
			update(2 * i, l, mid, j, x);
		else
			update(2 * i + 1, mid + 1, r, j, x);
		pushup(i);
	}
	//通过节点区间的收敛找到更改点，不需要更改传入区间，这是真正的点更新
	void update1(int i, int j, int x) {
		if(t[i].l>j||t[i].r<j) return ;
		if (t[i].l>=j &&t[i].r<=j) {
			t[i].f11 = max<int>(x, 0);
			return;
		}
		update1(2*i,j,x);
		update1(2*i+1,j,x);
		pushup(i);
	}
};


int maximumSumSubsequence(vector<int>& nums, vector<vector<int>>& queries) {
	int n = nums.size();
	SegmentTree seg(n);
	seg.build(1, 1, n, nums);
	long long ans = 0;
	for (auto& q : queries) {
		seg.update(1, 1, n, q[0] + 1, q[1]);
		ans = (ans + seg.t[1].f11) % mod;
	}
	return ans;
}
